home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Programming / AmigaTalk / User / Complex.st < prev    next >
Text File  |  2000-05-08  |  4KB  |  193 lines

  1. " ------------------------------------------------------------- "
  2. " Complex.st - Implementation of complex number class for       "
  3. "              AmigaTalk.                                       "
  4. " ------------------------------------------------------------- "
  5.  
  6. Class Complex :Magnitude
  7. ! real imag mag phase !
  8. [
  9.   new
  10.     real  <- Float new: 0.0.
  11.     imag  <- Float new: 0.0.
  12.     mag   <- Float new: 0.0.
  13.     phase <- Float new: 0.0
  14. |
  15.   realpart
  16.     ^real
  17. |
  18.   imagpart
  19.     ^imag
  20. |
  21.   magpart
  22.     ^mag
  23. |
  24.   phasepart
  25.     ^phase
  26. |
  27.   realpart: newReal
  28.     real  <- newReal
  29. |
  30.   imagpart: newImag
  31.     imag  <- newImag
  32. |
  33.   magpart: newMag
  34.     mag   <- newMag
  35. |
  36.   phasepart: newPhase
  37.     phase <- newPhase
  38. |
  39.   coerce: aNumber ! newComplex !
  40.     newComplex <- Complex new.
  41.  
  42.     newComplex realpart: aNumber.
  43.     newComplex imagpart: 0.0.
  44.  
  45.     ^ newComplex
  46. |
  47.   conjugate
  48.     imag <- -1.0 * imag
  49. |
  50.   ~
  51.     ^ conjugate self
  52. |
  53.   + aNumber ! nc !
  54.  
  55.     (aNumber isKindOf: (self class))
  56.       ifFalse: [ nc <- self coerce: aNumber ]
  57.       ifTrue:  [ nc <- aNumber              ].
  58.  
  59.     real <- nc realpart + self realpart.
  60.     imag <- nc imagpart + self imagpart.
  61.  
  62.     ^ self
  63. |
  64.   - aNumber ! nc !
  65.  
  66.     (aNumber isKindOf: (self class))
  67.       ifFalse: [ nc <- self coerce: aNumber ]
  68.       ifTrue:  [ nc <- aNumber              ].
  69.  
  70.     real <- self realpart - nc realpart.
  71.     imag <- self imagpart - nc imagpart.
  72.  
  73.     ^ self
  74. |
  75.   * aNumber ! nc !
  76.  
  77.     (aNumber isKindOf: (self class))
  78.       ifFalse: [ nc <- self coerce: aNumber ]
  79.       ifTrue:  [ nc <- aNumber              ].
  80.  
  81.     real <- (self realpart * nc realpart) - (self imagpart * nc imagpart).
  82.     imag <- (self imagpart * nc realpart) + (self realpart * nc imagpart).
  83.  
  84.     ^ self
  85. |
  86.   / aNumber ! nc denom r i !
  87.  
  88.     (aNumber isKindOf: (self class))
  89.       ifFalse: [ nc <- self coerce: aNumber ]
  90.       ifTrue:  [ nc <- aNumber              ].
  91.  
  92.     ((nc realpart == 0.0) & (nc imagpart == 0.0))
  93.       ifTrue: [ <primitive 123 'Division by Complex zero!'>.
  94.                 ^ nil 
  95.               ].
  96.     
  97.     denom <- (nc realpart * nc realpart) + (nc imagpart * nc imagpart).
  98.     r     <- (nc realpart * self realpart) + (nc imagpart * self imagpart).
  99.     i     <- (self imagpart * nc realpart) - (self realpart * nc imagpart).
  100.       
  101.     real  <- r / denom.
  102.     imag  <- i / denom.
  103.  
  104.     ^ self
  105. |
  106.   printString ! str !
  107.     ('{', <primitive 78 real>, ', ', <primitive 78 imag>, '}') print
  108. |
  109.   computeMag
  110.     mag <- <primitive 71 ((self realpart * self realpart) \ 
  111.                         + (self imagpart * self imagpart))>
  112. |
  113.   computeMagPhase
  114.     self computeMag.
  115.  
  116.     (self imagpart == 0.0)
  117.       ifTrue: [ <primitive 123 'Division by Complex zero!'> ].
  118.     
  119.     phase <- (self realpart / self imagpart) arcTan      
  120. |
  121.   == aNumber ! nc !
  122.  
  123.     (aNumber isKindOf: (self class))
  124.       ifFalse: [ nc <- self coerce: aNumber ]
  125.       ifTrue:  [ nc <- aNumber              ].
  126.  
  127.     ((self realpart = nc realpart) & (self imagpart = nc imagpart))
  128.       ifTrue:  [ ^ true  ]
  129.       ifFalse: [ ^ false ]
  130. |
  131.   < aNumber ! nc !
  132.  
  133.     (aNumber isKindOf: (self class))
  134.       ifFalse: [ nc <- self coerce: aNumber ]
  135.       ifTrue:  [ nc <- aNumber              ].
  136.  
  137.     self computeMag.
  138.     nc   computeMag.
  139.     
  140.     (self magpart < nc magpart)
  141.       ifTrue:  [ ^ true  ]
  142.       ifFalse: [ ^ false ]
  143. |
  144.   > aNumber ! nc !
  145.  
  146.     (aNumber isKindOf: (self class))
  147.       ifFalse: [ nc <- self coerce: aNumber ]
  148.       ifTrue:  [ nc <- aNumber              ].
  149.  
  150.     self computeMag.
  151.     nc   computeMag.
  152.     
  153.     (self magpart > nc magpart)
  154.       ifTrue:  [ ^ true  ]
  155.       ifFalse: [ ^ false ]
  156. |
  157.   <= aNumber ! nc !
  158.  
  159.     (aNumber isKindOf: (self class))
  160.       ifFalse: [ nc <- self coerce: aNumber ]
  161.       ifTrue:  [ nc <- aNumber              ].
  162.  
  163.     self computeMag.
  164.     nc   computeMag.
  165.     
  166.     (self magpart <= nc magpart)
  167.       ifTrue:  [ ^ true  ]
  168.       ifFalse: [ ^ false ]
  169. |
  170.   >= aNumber ! nc !
  171.  
  172.     (aNumber isKindOf: (self class))
  173.       ifFalse: [ nc <- self coerce: aNumber ]
  174.       ifTrue:  [ nc <- aNumber              ].
  175.  
  176.     self computeMag.
  177.     nc   computeMag.
  178.     
  179.     (self magpart >= nc magpart)
  180.       ifTrue:  [ ^ true  ]
  181.       ifFalse: [ ^ false ]
  182. |
  183.   ~= aNumber ! nc !
  184.  
  185.     (aNumber isKindOf: (self class))
  186.       ifFalse: [ nc <- self coerce: aNumber ]
  187.       ifTrue:  [ nc <- aNumber              ].
  188.  
  189.     ((self realpart ~= nc realpart) & (self imagpart ~= nc imagpart))
  190.       ifTrue:  [ ^ true  ]
  191.       ifFalse: [ ^ false ]
  192. ]
  193.